//
//  SoundSearcher.m
//  MokoAPP
//
//  Created by cj848 on 11. 7. 27..
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "SoundSearcher.h"
//가
#define HANGUL_BEGIN_UNICODE 44032
// 힣
#define HANGUL_LAST_UNICODE 55203
// 각 자음마다 가지는 글자수
#define HANGUL_BASE_UNIT 588
// 초성 정의
static const NSString* const INITIAL_SOUND[] = { @"ㄱ", @"ㄲ", @"ㄴ", @"ㄷ", @"ㄸ", @"ㄹ", @"ㅁ", @"ㅂ", @"ㅃ", @"ㅅ", @"ㅆ", @"ㅇ", @"ㅈ", @"ㅉ", @"ㅊ", @"ㅋ", @"ㅌ", @"ㅍ", @"ㅎ" };
@implementation SoundSearcher
+(BOOL) isInitialSound:(unichar) searcher {
    int INITIAL_SOUND_SIZE = sizeof(INITIAL_SOUND) / sizeof(NSString*);
    for( int i = 0; i < INITIAL_SOUND_SIZE; i++ ) {
        if( searcher == [INITIAL_SOUND[i] characterAtIndex:0])
            return YES;
    }
    return NO;
}
+(BOOL) isHangul:(unichar) c {
    return HANGUL_BEGIN_UNICODE <= c && c <= HANGUL_LAST_UNICODE;
}
+(BOOL) matchString:(NSString*)value search:(NSString*)search {
    int t = 0;
    int seof = [value length] - [search length];
    int slen = [search length];
    if(seof < 0)
        return false; //검색어가 더 길면 false를 리턴한다.
    for(int i = 0;i <= seof;i++){
        t = 0;
        while(t < slen){
            unichar srch_t = [[search lowercaseString] characterAtIndex:t];
            unichar value_i_t = [[value lowercaseString] characterAtIndex:i+t];
            
            if([self isInitialSound:srch_t]==YES && [self isHangul:value_i_t] == YES){
                //만약 현재 char이 초성이고 value가 한글이면
                if([self getInitialSound:value_i_t] ==srch_t)
                    //각각의 초성끼리 같은지 비교한다
                    t++;
                else
                    break;
            } else {
                //char이 초성이 아니라면
                if(value_i_t == srch_t)
                    //그냥 같은지 비교한다.
                    t++;
                else
                    break;
            }
        }
        if(t == slen)
            return true; //모두 일치한 결과를 찾으면 true를 리턴한다.
    }
    return false; //일치하는 것을 찾지 못했으면 false를 리턴한다.
}
// 입력 받은 한글의 초성 값을 가져온다.
+(unichar) getInitialSound:(unichar) c {
    
    int hanBegin = (c - HANGUL_BEGIN_UNICODE);
    int index = hanBegin / HANGUL_BASE_UNIT;
    return [INITIAL_SOUND[index] characterAtIndex:0];
}
@end
